
package de.syfy.project.game.base;

import de.syfy.project.utils.SVTupel;

/**
 * Charakter-werte (charakterBogen?)
 * 
 * @author felixspielmann
 */
public class CharacterValue {
    
    /**
     * verfügbare Rassen
     */
    public static enum Race { Orc , Org , Orx , Mensch , Mähaner , Delfinaut };
    
    /**
     * Rasse des Characters, per default Mensch 
     */
    Race race = Race.Mensch;
    
    /**
     * Bewegungsgeschwindigkeit (einheit noch nicht sicher ;) )
     */
    double movementSpeed = 2;
    
    /**
     * Trefferpunkte
     */
    int hp; 
    
    /**
     * Erfahrungspunkte
     */
    double exp; 
    
    /**
     * aktuelles Level
     */
    int lvl;    
   
    
    //Primär Attribute
    
    /**
     * Auffassungsgabe, geistiges Attribut. 
     * Für das erlernen von Fähigkeiten, und anwenden geistiger Fähigkeiten
     */
    int intelligence ;
    
    /**
     * Zwischenmenschliches, Attribut für Ablenkung und Handel.
     */
    int charisma;
    
    /**
     * Körperliches, wie viel stark ist der Charakter.
     */
    int strength;
    
    /**
     * Ausdauer/Aushalten.
     */     
    int konstitution;
    
    /**
     * Geschick
     */
    int agility;
    
    // sekundär Attribute
    
    double meleekrit;
    //private double meleehit; // nötig? => nein! 
    double meleetempo;
    
    double rangekrit;
    double rangehit; // nötig!! => genauigkeit der kugeln
    double rangetempo;
   
    double avoid;
    
    public CharacterValue(int intelligence, int charisma, int strength, int konstitution , int agility) {
        this.intelligence = intelligence;
        this.charisma = charisma;
        this.strength = strength;
        this.konstitution = konstitution;
        this.agility = agility;
        this.meleekrit = 0.001*strength;
    }
        
    /**
     * erhöt die Charakterwerte
     * @param charValue Wert, um den der bestehende Wert erhöt wird
     */
    public void add(CharacterValue charValue){
        this.intelligence += charValue.intelligence;
        this.charisma += charValue.charisma;
        this.strength += charValue.strength;
        this.konstitution += charValue.konstitution;
        this.agility += charValue.agility;
    }
    
    /**
     * veringert die Charakterwerte
     * @param charValue Wert, um den der bestehende Wert veringert wird
     */
    public void sub(CharacterValue charValue){
        this.intelligence -= charValue.intelligence;
        this.charisma -= charValue.charisma;
        this.strength -= charValue.strength;
        this.konstitution -= charValue.konstitution;
        this.agility -= charValue.agility;
    }

    public int getAgility() {
        return agility;
    }

    public double getAvoid() {
        return avoid;
    }

    public int getCharisma() {
        return charisma;
    }

    public double getExp() {
        return exp;
    }

    public int getHp() {
        return hp;
    }

    public int getIntelligence() {
        return intelligence;
    }

    public int getKonstitution() {
        return konstitution;
    }

    public int getLvl() {
        return lvl;
    }

    public double getMeleekrit() {
        return meleekrit;
    }

    public double getMeleetempo() {
        return meleetempo;
    }

    public double getMovementSpeed() {
        return movementSpeed;
    }

    public Race getRace() {
        return race;
    }

    public double getRangehit() {
        return rangehit;
    }

    public double getRangekrit() {
        return rangekrit;
    }

    public double getRangetempo() {
        return rangetempo;
    }

    public int getStrength() {
        return strength;
    }

    
    
    @Override
    public String toString(){
        return  "Primärattribute:\n---------------\n "
                +"\n Intelligenz: \t"+ this.intelligence
                +"\n Stärke: \t"+this.strength
                +"\n Charisma: \t"+this.charisma
                +"\n Konstitution: \t"+this.konstitution
                +"\n Geschick: \t"+this.agility
                +"\n -----------------"
                +"\n Gesamt: \t"+(this.intelligence+ this.strength+ this.konstitution+this.charisma+this.agility)
                +"\n ------- \n Sekundäre: \n" + this.meleekrit;
    }
    
    
    /**
     * Gibt die Aktuellen Hauptattribute sortiert aus
     */
    public SVTupel[] getSortedValues(){
        SVTupel[] ret = new SVTupel[5];
        ret[0]= new SVTupel("Stärke", this.strength);
        ret[1]= new SVTupel("Intelligenz", this.intelligence);
        ret[2]= new SVTupel("Charisma", this.charisma);
        ret[3]= new SVTupel("Konstitution", this.konstitution);
        ret[4]= new SVTupel("Geschick", this.agility);
        
        for(int i = 1 ; i < ret.length;i++){
            
            int k = i;
            SVTupel swap = ret[k];
            while((k > 0 && ret[k-1].getI() > swap.getI())){               
                
                ret[k]=ret[k-1];
                
                k--;
            }
            ret[k]=swap;
        }
        return ret;
    }

    public void setHp(int hp) {
        System.out.println("Neue HP: " + hp);
        this.hp = hp;
    }

    public void setExp(double exp) {
        this.exp = exp;
    }
    
}
